package com.cvpoc.hibernate.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.BeanUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.cvpoc.dto.CollaborateurLangueDTO;
import com.cvpoc.dto.LangueDTO;
import com.cvpoc.hibernate.dao.LangueDao;
import com.cvpoc.model.CollaborateurLangue;
import com.cvpoc.model.Langue;

public class LangueDaoImpl extends HibernateDaoSupport implements LangueDao {
	
	@Override
	public LangueDTO findLangueById(int idLangue) {
		Langue langue = (Langue)  getHibernateTemplate().get(Langue.class, idLangue);
		LangueDTO langueDTO = new LangueDTO();

		BeanUtils.copyProperties(langue, langueDTO);

		return langueDTO;
	}

	@Override
	public List<LangueDTO> findAllLangue() {
		List<LangueDTO> langueDTOs = new ArrayList<LangueDTO>();
		LangueDTO target = null;
		
		List<Langue> langues = getHibernateTemplate().loadAll(Langue.class);

		for (Langue langue : langues) {
			target = new LangueDTO();
			BeanUtils.copyProperties(langue, target);
			langueDTOs.add(target);
		}
		return langueDTOs;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<CollaborateurLangueDTO> findListLanguesByIdCollaborateur(
			int idCollaborateur) {
		List<CollaborateurLangueDTO> collaborateurLangueDTOs = new ArrayList<CollaborateurLangueDTO>();
		String[] excludeProperties = {"langue"};
		CollaborateurLangueDTO target = null;
		
		DetachedCriteria dc = DetachedCriteria.forClass(CollaborateurLangue.class);
		dc.add(Restrictions.eq("id_collaborateur", idCollaborateur));

		List<CollaborateurLangue> collaborateurLangues = getHibernateTemplate()
				.findByCriteria(dc);

		for (CollaborateurLangue collaborateurLangue : collaborateurLangues) {
			target = new CollaborateurLangueDTO();
			target.setLangue(new LangueDTO());
			BeanUtils.copyProperties(collaborateurLangue, target, excludeProperties);
			BeanUtils.copyProperties(collaborateurLangue.getLangue(), target.getLangue());
			collaborateurLangueDTOs.add(target);
		}

		return collaborateurLangueDTOs;
	}

	@SuppressWarnings("unchecked")
	@Override
	public CollaborateurLangueDTO findLangueByIdCollaborateur(int idLangue,
			int idCollaborateur) {
		CollaborateurLangueDTO collaborateurLangueDTO = new CollaborateurLangueDTO();
		collaborateurLangueDTO.setLangue(new LangueDTO());
		String[] excludeProperties = {"langue"};
		
		DetachedCriteria dc = DetachedCriteria.forClass(CollaborateurLangue.class);
		dc.add(Restrictions.eq("id_collaborateur", idCollaborateur));
		dc.add(Restrictions.eq("langue.id", idLangue));
		
		List<CollaborateurLangue> collaborateurLangues = getHibernateTemplate()
				.findByCriteria(dc);
		if(collaborateurLangues.size()>0){
			BeanUtils.copyProperties(collaborateurLangues.get(0), collaborateurLangueDTO, excludeProperties);
			BeanUtils.copyProperties(collaborateurLangues.get(0).getLangue(), collaborateurLangueDTO.getLangue());
		}

		return collaborateurLangueDTO;
	}

	@Override
	public int createLangue(LangueDTO langueDTO) {
		Langue langue = new Langue();

		BeanUtils.copyProperties(langueDTO, langue);
		int idCreate = (Integer) getHibernateTemplate().save(langue);
		return idCreate;
	}

	@Override
	public void createCollaborateurLangue(
			CollaborateurLangueDTO collaborateurLangueDTO) {
		CollaborateurLangue collaborateurLangue = new CollaborateurLangue();
		collaborateurLangue.setLangue(new Langue());
		String[] excludeProperties = {"langue"};

		BeanUtils.copyProperties(collaborateurLangueDTO, collaborateurLangue, excludeProperties);
		BeanUtils.copyProperties(collaborateurLangueDTO.getLangue(), collaborateurLangue.getLangue());
		getHibernateTemplate().save(collaborateurLangue);
	}

	@Override
	public void updateLangue(LangueDTO langueDTO) {
		Langue langue = new Langue();

		BeanUtils.copyProperties(langueDTO, langue);
		getHibernateTemplate().merge(langue);
	}

	@Override
	public void deleteLangue(int idLangue) {
		Langue langue = (Langue) getHibernateTemplate().load(Langue.class, idLangue);
		getHibernateTemplate().delete(langue);
	}

	@Override
	public void deleteCollaborateurLangue(
			CollaborateurLangueDTO collaborateurLangueDTO) {
		CollaborateurLangue collaborateurLangue = new CollaborateurLangue();
		collaborateurLangue.setLangue(new Langue());
		String[] excludeProperties = {"langue"};
		
		BeanUtils.copyProperties(collaborateurLangueDTO, collaborateurLangue, excludeProperties);
		BeanUtils.copyProperties(collaborateurLangueDTO.getLangue(), collaborateurLangue.getLangue());
		
		getHibernateTemplate().delete(collaborateurLangue);
	}

	@Override
	public void updateCollaborateurLangue(
			CollaborateurLangueDTO collaborateurLangueDTO) {
		CollaborateurLangue collaborateurLangue = new CollaborateurLangue();
		collaborateurLangue.setLangue(new Langue());
		String[] excludeProperties = {"langue"};
		
		BeanUtils.copyProperties(collaborateurLangueDTO, collaborateurLangue, excludeProperties);
		BeanUtils.copyProperties(collaborateurLangueDTO.getLangue(), collaborateurLangue.getLangue());
		
		getHibernateTemplate().merge(collaborateurLangue);
	}

}
